// https://leetcode.cn/problems/add-two-numbers/
// 给你两个 非空 的链表，表示两个非负的整数。
// 它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
// 请你将两个数相加，并以相同形式返回一个表示和的链表。
// 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。

function ListNode(val, next) {
  this.val = val === undefined ? 0 : val
  this.next = next === undefined ? null : next
}

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  const dummy = new ListNode(Infinity, null)
  let tail = dummy
  let carry = 0

  while (l1 || l2 || carry) {
    let v1 = l1?.val ?? 0
    let v2 = l2?.val ?? 0

    let total = v1 + v2 + carry
    // carry = total >= 10 ? 1 : 0
    carry = Math.floor(total / 10)
    tail.next = new ListNode(total % 10)

    tail = tail.next
    l1 = l1?.next
    l2 = l2?.next
  }

  return dummy.next
}

function arrToList(arr) {
  const dummy = new ListNode(Infinity)
  let tail = dummy
  arr.forEach(v => {
    tail.next = new ListNode(v)
    tail = tail.next
  })

  return dummy.next
}

function listToArr(list, dummy = false) {
  const arr = []
  for (let p = dummy ? list.next : list; p; p = p.next) {
    arr.push(p.val)
  }

  return arr
}

const l1 = arrToList([2, 4, 3])
const l2 = arrToList([5, 6, 4])
console.log(listToArr(addTwoNumbers(l1, l2))) // [7, 0, 8]
